int
__trap_to_gdb(struct cpu_user_regs *regs, unsigned long cookie)
{
- int resume = 0;
- int r;
+ int rc = 0;
unsigned long flags;
if ( gdb_ctx->serhnd < 0 )
{
dbg_printk("Debugger not ready yet.\n");
- return 0;
+ return -EBUSY;
}
/* We rely on our caller to ensure we're only on one processor
{
printk("WARNING WARNING WARNING: Avoiding recursive gdb.\n");
atomic_inc(&gdb_ctx->running);
- return 0;
+ return -EBUSY;
}
if ( !gdb_ctx->connected )
gdb_cmd_signum(gdb_ctx);
}
- while ( resume == 0 )
- {
- r = receive_command(gdb_ctx);
- if ( r < 0 )
- {
- dbg_printk("GDB disappeared, trying to resume Xen...\n");
- resume = 1;
- }
- else
+ do {
+ if ( receive_command(gdb_ctx) < 0 )
{
- resume = process_command(regs, gdb_ctx);
+ dbg_printk("Error in GDB session...\n");
+ rc = -EIO;
+ break;
}
- }
+ } while ( process_command(regs, gdb_ctx) == 0 );
gdb_arch_exit(regs);
console_end_sync();
local_irq_restore(flags);
- return 0;
+ return rc;
}
void
* 2. debugger_trap_fatal():
* Called when Xen is about to give up and crash. Typically you will use this
* hook to drop into a debug session. It can also be used to hook off
- * deliberately caused traps (which you then handle and return non-zero)
- * but really these should be hooked off 'debugger_trap_entry'.
+ * deliberately caused traps (which you then handle and return non-zero).
*
* 3. debugger_trap_immediate():
* Called if we want to drop into a debugger now. This is essentially the
* same as debugger_trap_fatal, except that we use the current register state
* rather than the state which was in effect when we took the trap.
- * Essentially, if we're dying because of an unhandled exception, we call
+ * For example: if we're dying because of an unhandled exception, we call
* debugger_trap_fatal; if we're dying because of a panic() we call
* debugger_trap_immediate().
*/
#include <xen/gdbstub.h>
-#define __debugger_trap_entry(_v, _r) (0)
-
-static inline int __debugger_trap_fatal(
+static inline int debugger_trap_fatal(
unsigned int vector, struct cpu_user_regs *regs)
{
- (void)__trap_to_gdb(regs, vector);
- return (vector == TRAP_int3); /* int3 is harmless */
+ return (__trap_to_gdb(regs, vector) == 0);
}
/* Int3 is a trivial way to gather cpu_user_regs context. */
#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" );
-#elif 0
-
-extern int kdb_trap(int, int, struct cpu_user_regs *);
-
-static inline int __debugger_trap_entry(
- unsigned int vector, struct cpu_user_regs *regs)
-{
- return 0;
-}
-
-static inline int __debugger_trap_fatal(
- unsigned int vector, struct cpu_user_regs *regs)
-{
- return kdb_trap(vector, 0, regs);
-}
-
-/* Int3 is a trivial way to gather cpu_user_regs context. */
-#define debugger_trap_immediate() __asm__ __volatile__ ( "int3" )
-
#else
-#define __debugger_trap_entry(_v, _r) (0)
-#define __debugger_trap_fatal(_v, _r) (0)
-#define __debugger_trap_immediate() ((void)0)
+#define debugger_trap_fatal(v, r) (0)
+#define debugger_trap_immediate() ((void)0)
#endif
return 1;
}
- return __debugger_trap_entry(vector, regs);
+ return 0;
}
-#define debugger_trap_fatal(v, r) (__debugger_trap_fatal(v, r))
-#ifndef debugger_trap_immediate
-#define debugger_trap_immediate() (__debugger_trap_immediate())
-#endif
-
#endif /* __X86_DEBUGGER_H__ */